#ifndef ANIMAL_H
#define ANIMAL_H

#include <vector>
#include <string>

/// An abstract class representing an animal entity
class Animal
{
public:	
	virtual ~Animal() = 0 {};

	/*
	* @brief Simulates reproduction
	* @param[in] partner An animal object to mate with 
	* @return Returns the list of children.
	*/
	std::vector<Animal*> mate(Animal* partner);		

	std::string get_dna() const;	

	int get_id() const;
	std::vector<Animal*> get_parents() const;

	virtual std::string get_type() const = 0;

protected:	
	virtual int get_typical_number_of_children();
	virtual Animal* produce_child(Animal* partner) = 0;
	Animal(int id, std::string dna) 
		: id_(id), dna_(dna)
	{			
	}	


private:
	int id_;
	std::string dna_;	
	std::vector<Animal*> parents_;
};

#endif